用多于一个变量来表示一个状态, 变量之间很容易不一致呢.
conflict
假如我们要描述以下这个状态:
在一次mouse click的picking中, 我们给出了pick的范围, 一个rectangle, 然后要标记是否只要pick一个物体object就够了, 还是pick所有在rectangel下面的物体.
当假如我们只要pick到一个物体就够了, 那可能在for里面, 一旦找到某一个物体有效, 我们就可以返回, 退出pick过程了. 也就是我们只要pick到第一个有效物体就ok了, 而不考虑这个pick到的物体是否距离mouse click的点最近.
那么, 要记录这个状态, 我们看下面的实现:
class XViewContext
{
public:
PickingResult pick(...);
void setPickSingle(bool b) { m_bPickSingle = b; };
bool pickSingle() const { return m_bPickSingle; };
private:
bool m_bPickSingle;
};
PickingResult XViewContext::pick(...)
{
...
if ( pickSingle() ) ...;
else ...;
}
在这实现中, 是否要pick单一个物体的状态作为data member inside a class; 在函数使用这个状态时候就用那个类成员.
so far so good, until ... 不知哪时出于某些需求, pick()函数的参数中增加了一个变量, 变为:
PickingResult XViewContext::pick(..., bool bPickSingle)
{
...
if ( bPickSingle ) ...;
else ...;
}
pick()函数里面用传入过来的参数bPickSingle而不是类成员变量pickSingle()了.
而我的想法是这样的结果会出现:
+ bPickSingle 与 pickSingle()的值 可能不一致的. 于是就可能出现bug, 例如你想要bPickSingle == true, 但是pickSingle() == false, 这时候, pick的结果就跟pick()函数里面到底是用哪个来决定了, 而很多时候你是没有看到pick()函数的实现的,更坏地是pick()函数的实现中两个都使用了.
+ 我们好像可以避免这样的不一致, 要么就只用成员变量pickSingle(), 要么就在类里面不维护这么一个成员变量, 而在每次调用pick()前面都声明一个局部变量bPickSingle.